﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BLL;
using Exceptions;

namespace WCF
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "WCFCliente" in code, svc and config file together.
    public class WCFCliente : IWCFCliente
    {
        public List<DTO.Cliente> list()
        {
            BLLCliente bllCliente = new BLLCliente();
            List<BTO.Cliente> btoClientes = bllCliente.list();
            List<DTO.Cliente> dtoClientes = new List<DTO.Cliente>();
            DTO.Cliente dtoCliente;

            foreach (BTO.Cliente btoCliente in btoClientes)
            {
                dtoCliente = new DTO.Cliente();
                dtoCliente.IDCliente = btoCliente.IDCliente;
                dtoCliente.nome = btoCliente.nome;
                dtoCliente.morada = btoCliente.morada;
                dtoCliente.codpostal = btoCliente.codpostal;
                dtoCliente.localizacao = btoCliente.localizacao;
                dtoCliente.telefone = btoCliente.telefone;
                dtoCliente.passaporte = btoCliente.passaporte;
                dtoCliente.email = btoCliente.email;

                dtoClientes.Add(dtoCliente);
            }

            return dtoClientes;
        }

        public DTO.Cliente getByID(int id)
        {
                        
            BLLCliente bllCliente = new BLLCliente();
            DTO.Cliente dtoCliente = new DTO.Cliente();

            try
            {
                BTO.Cliente btoCliente = bllCliente.getByID(id);
    
                dtoCliente.IDCliente = btoCliente.IDCliente;
                dtoCliente.nome = btoCliente.nome;
                dtoCliente.morada = btoCliente.morada;
                dtoCliente.codpostal = btoCliente.codpostal;
                dtoCliente.localizacao = btoCliente.localizacao;
                dtoCliente.telefone = btoCliente.telefone;
                dtoCliente.passaporte = btoCliente.passaporte;
                dtoCliente.email = btoCliente.email;
            }
            catch (NotFoundClienteException e)
            {
                throw new NotFoundClienteException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Cliente não encontrado!");
            }
            return dtoCliente;
        }

        public DTO.Cliente getByPassaporte(String passaporte)
        {
            BLLCliente bllCliente = new BLLCliente();
            DTO.Cliente dtoCliente = new DTO.Cliente();

            try
            {
                BTO.Cliente btoCliente = bllCliente.getByPassaporte(passaporte);

                dtoCliente.IDCliente = btoCliente.IDCliente;
                dtoCliente.nome = btoCliente.nome;
                dtoCliente.morada = btoCliente.morada;
                dtoCliente.codpostal = btoCliente.codpostal;
                dtoCliente.localizacao = btoCliente.localizacao;
                dtoCliente.telefone = btoCliente.telefone;
                dtoCliente.passaporte = btoCliente.passaporte;
                dtoCliente.email = btoCliente.email;
            }
            catch (PassaporteClienteException e)
            {
                throw new PassaporteClienteException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Cliente não encontrado!");
            }

            return dtoCliente;
        }

        public void insert(DTO.Cliente toInsert)
        {
            BLLCliente bllCliente = new BLLCliente();
            BTO.Cliente btoCliente;

            btoCliente = new BTO.Cliente();
            btoCliente.nome = toInsert.nome;
            btoCliente.morada = toInsert.morada;
            btoCliente.codpostal = toInsert.codpostal;
            btoCliente.localizacao = toInsert.localizacao;
            btoCliente.telefone = toInsert.telefone;
            btoCliente.passaporte = toInsert.passaporte;
            btoCliente.email = toInsert.email;

            try
            {
                bllCliente.insert(btoCliente);
            }
            catch (InsertDadosClienteException e)
            {
                throw new InsertDadosClienteException(e.Message);
            }
            catch (PassaporteClienteException e)
            {
                throw new PassaporteClienteException(e.Message);
            }
            catch (Exception e)
            {
                throw new InsertClienteException(e.Message);
            }
        }

        public void update(DTO.Cliente toUpdate)
        {
            BLLCliente bllCliente = new BLLCliente();
            BTO.Cliente btoCliente = new BTO.Cliente();

            btoCliente.IDCliente = toUpdate.IDCliente;
            btoCliente.nome = toUpdate.nome;
            btoCliente.morada = toUpdate.morada;
            btoCliente.codpostal = toUpdate.codpostal;
            btoCliente.localizacao = toUpdate.localizacao;
            btoCliente.telefone = toUpdate.telefone;
            btoCliente.passaporte = toUpdate.passaporte;
            btoCliente.email = toUpdate.email;

            try
            {
                bllCliente.update(btoCliente);
            }
            catch (InsertDadosClienteException e)
            {
                throw new InsertDadosClienteException(e.Message);
            }
            catch (PassaporteClienteException e)
            {
                throw new PassaporteClienteException(e.Message);
            }
            catch (Exception e)
            {
                throw new UpdateAgenciaException(e.Message);
            }
        }

        public void delete(int id)
        {
            BLLCliente bllCliente = new BLLCliente();

            try
            {
                bllCliente.delete(id);
            }
            catch (ReservasAssociadasClienteException e)
            {
                throw new ReservasAssociadasClienteException(e.Message);
            }
            catch (ContactosAssociadasClienteException e)
            {
                throw new ContactosAssociadasClienteException(e.Message);
            }
            catch (Exception e)
            {
                throw new DeleteClienteException(e.Message);
            }
        }
    }
}
